package net.hn.hnms.biz.analysis.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class DustRuleUtil {

    /**
     * 获取井下接尘时间得分
     *
     * @param timeDuration 接尘时间（单位：小时）
     * @return 得分（float 类型）
     */
    public static float getUndergroundDustExposureTime(float timeDuration) {
        float result = 1.0f;

        // 根据接尘时间计算结果
        if (timeDuration >= 50) {
            result = 0.0f;
        } else if (timeDuration > 0 && timeDuration < 50) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round((timeDuration / 50) * 10000) / 10000.0;
            result = (float) temp;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取接尘作业人数得分
     *
     * @param personCount 接尘作业人数
     * @return 得分（float 类型）
     */
    public static float getUndergroundDustExposurePersonCount(float personCount) {
        float result = 1.0f;

        // 根据接尘作业人数计算结果
        if (personCount > 70) {
            result = 0.0f;
        }

        // 返回最终得分
        return result * 100;
    }

    /**
     * 获取煤尘爆炸性得分
     *
     * @param status 煤尘爆炸性状态（1 表示有爆炸性，其他值表示无爆炸性）
     * @return 得分（float 类型）
     */
    public static float getCoalDustExplosionStatus(float status) {
        float result = 0.0f;

        // 根据状态计算结果
        if (status == 1) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取煤尘报警次数得分
     *
     * @param alarmCount 煤尘报警次数
     * @return 得分（float 类型）
     */
    public static float getCoalDustAlarmCount(float alarmCount) {
        float result = 0.0f;

        // 根据报警次数计算结果
        if (alarmCount > 0 && alarmCount < 5) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round(((5 - alarmCount) / 5) * 10000) / 10000.0;
            result = (float) temp;
        } else if (alarmCount <= 0) {
            result = 1.0f;
        }

        // 返回最终得分
        return result * 100;
    }

    /**
     * 获取工作面风速得分
     *
     * @param windSpeed 工作面风速
     * @return 得分（float 类型）
     */
    public static float getCoalfaceWindspeed(float windSpeed) {
        float result = 0.0f;

        // 根据风速计算结果
        if (windSpeed < 0.5) {
            double temp = 0.97 * (windSpeed - 0.4);
            result = roundTo4Decimals((float) Math.exp(temp));
        } else if (windSpeed >= 0.5 && windSpeed <= 3) {
            result = 1.0f;
        } else {
            double temp = -0.006 * (windSpeed - 3);
            result = roundTo4Decimals((float) Math.exp(temp));
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 四舍五入到小数点后 4 位
     *
     * @param value 需要四舍五入的值
     * @return 四舍五入后的值
     */
    private static float roundTo4Decimals(float value) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(4, RoundingMode.HALF_UP);
        return bd.floatValue();
    }

    /**
     * 获取除尘设备完好率得分
     *
     * @param percent 除尘设备完好率（百分比，范围为 0 到 100）
     * @return 得分（float 类型）
     */
    public static float getDustRemovalEquipmentPercent(float percent) {
        float result = 0.0f;

        // 根据完好率计算结果
        if (percent == 100) {
            result = 1.0f;
        } else if (percent > 95 && percent <= 100) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round(((percent - 95) / 5) * 10000) / 10000.0;
            result = (float) temp;
        }

        // 返回最终得分
        return result * 100;
    }

    /**
     * 获取测点安装覆盖率得分
     *
     * @param coverage 测点安装覆盖率（百分比，范围为 0 到 100）
     * @return 得分（float 类型）
     */
    public static float getMeasuringPointsCoverage(float coverage) {
        float result = 0.0f;

        // 根据覆盖率计算结果
        if (coverage == 100) {
            result = 1.0f;
        } else if (coverage > 95 && coverage < 100) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round(((coverage - 95) / 5) * 10000) / 10000.0;
            result = (float) temp;
        }

        // 返回最终得分
        return result * 100;
    }

    /**
     * 获取采掘作业机械化程度得分
     *
     * @param percent 采掘作业机械化程度（百分比，范围为 0 到 100）
     * @return 得分（float 类型）
     */
    public static float getMiningOperationMechanizedDegree(float percent) {
        float result = 0.0f;

        // 根据机械化程度计算结果
        if (percent >= 95) {
            result = 1.0f;
        } else if (percent > 80 && percent < 95) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round(((percent - 80) / 15) * 10000) / 10000.0;
            result = (float) temp;
        }

        // 返回最终得分
        return result * 100;
    }

    /**
     * 获取防护装备完好率得分
     *
     * @param percent 防护装备完好率（百分比，范围为 0 到 100）
     * @return 得分（float 类型）
     */
    public static float getProtectiveEquipmentPercent(float percent) {
        float result = 0.0f;

        // 根据防护装备完好率计算结果
        if (percent == 100) {
            result = 1.0f;
        } else if (percent > 95 && percent < 100) {
            // 计算 temp 并保留 4 位小数
            double temp = Math.round(((percent - 95) / 5) * 10000) / 10000.0;
            result = (float) temp;
        }

        // 返回最终得分
        return result * 100;
    }


    /**
     * 获取粉尘防治制度得分
     *
     * @param isExist 是否存在粉尘防治制度（1 表示存在，其他值表示不存在）
     * @return 得分（float 类型）
     */
    public static float getDustPreventionSystem(int isExist) {
        float result = 0.0f;

        // 根据是否存在粉尘防治制度计算结果
        if (isExist == 1) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取粉尘防治机构得分
     *
     * @param isExist 是否存在粉尘防治机构（1 表示存在，其他值表示不存在）
     * @return 得分（float 类型）
     */
    public static float getDustPreventionInstitutes(int isExist) {
        float result = 0.0f;

        // 根据是否存在粉尘防治机构计算结果
        if (isExist == 1) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取个人防护发放得分
     *
     * @param isOk 是否个人防护发放正常（1 表示正常，其他值表示不正常）
     * @return 得分（float 类型）
     */
    public static float getPersonalProtectiveStatus(int isOk) {
        float result = 0.0f;

        // 根据个人防护发放状态计算结果
        if (isOk == 1) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取粉尘教育培训得分
     *
     * @param isOk 粉尘教育培训完成率（百分比，范围为 0 到 100）
     * @return 得分（float 类型）
     */
    public static float getDustEducationStatus(float isOk) {
        float result = 0.0f;

        // 根据粉尘教育培训完成率计算结果
        if (isOk > 95 && isOk < 100) {
            double temp = Math.round(((isOk - 95) / 5) * 10000) / 10000.0;
            result = (float) temp;
        } else if (isOk <= 95) {
            result = 0.0f;
        } else if (isOk == 100) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

    /**
     * 获取降尘措施落实得分
     *
     * @param isOk 是否降尘措施落实（1 表示落实，其他值表示未落实）
     * @return 得分（float 类型）
     */
    public static float getDustSuppressionImplemented(int isOk) {
        float result = 0.0f;

        // 根据降尘措施落实状态计算结果
        if (isOk == 1) {
            result = 1.0f;
        }

        // 返回最终得分
        return 100 * result;
    }

}
